#if FANTASY_NET
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
namespace Fantasy;

/// <summary>
/// 网络消息更新检查超时。
/// </summary>
public sealed class OnNetworkMessageUpdateCheckTimeout : TimerHandler<NetworkMessageUpdate>
{
    /// <summary>
    /// 超时时间（毫秒）。
    /// </summary>
    private const long Timeout = 40000;
    
    /// <summary>
    /// 处理网络消息更新检查超时。
    /// </summary>
    /// <param name="self"></param>
    /// <exception cref="NotImplementedException"></exception>
    public override void Handler(NetworkMessageUpdate self)
    {
        var timeNow = TimeHelper.Now;
        var selfNetworkMessagingComponent = self.NetworkMessagingComponent;
        
        // 遍历请求回调字典，检查是否有超时的请求，将超时请求添加到超时消息发送列表中。
        
        foreach (var (rpcId, value) in selfNetworkMessagingComponent.RequestCallback)
        {
            if (timeNow < value.CreateTime + Timeout)
            {
                break;
            }

            selfNetworkMessagingComponent.TimeoutRouteMessageSenders.Add(rpcId, value);
        }

        // 如果没有超时的请求，直接返回。
        
        if (selfNetworkMessagingComponent.TimeoutRouteMessageSenders.Count == 0)
        {
            return;
        }
        
        // 处理超时的请求，根据请求类型生成相应的响应消息，并进行处理。
        
        foreach (var (rpcId, routeMessageSender) in selfNetworkMessagingComponent.TimeoutRouteMessageSenders)
        {
            selfNetworkMessagingComponent.ReturnMessageSender(rpcId, routeMessageSender);
        }

        // 清空超时消息发送列表。
        
        selfNetworkMessagingComponent.TimeoutRouteMessageSenders.Clear();
    }
}
#endif